home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).zip / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).adf / ASo-Tools / Sources / TestKey.c < prev    next >
C/C++ Source or Header  |  1993-05-20  |  5KB  |  165 lines

  1. /* TestKey.c */
  2.  
  3. /* Aufruf: TestKey <Tastencode> ... <Tastencode> [ANY | ALL]
  4.    <Tastencode> = <Tastennummer> | QUALIFIER | NUMPAD | FKEYS | MISC |
  5.             RETURN | SPACE
  6.         dabei sind gleichwertig:
  7.         QUALIFIER   96 97 98 99 100 101 102 103
  8.                 (alle Qualifier-Tasten)
  9.         NUMPAD        15 29 30 31 45 46 47 61 62 63 67 74 90 91 92 93
  10.                 94 (alle Tasten am Ziffernblock)
  11.         FKEYS        80 81 82 83 84 85 86 87 88 89
  12.                 (alle Funktionstasten)
  13.         RETURN        67 68 (RETURN und ENTER)
  14.         MISC        65 66 70 69 76 77 78 79 95
  15.                 (ESC, TAB, BACKSPACE, DEL, HELP und die
  16.                  Cursortasten)
  17.         SPACE        64 (SPACE)
  18.    <Tastennummer> = <Tastennummer_dezimal> | $<Tastennummer_hexadezimal>
  19.    <Tastennummer_dezimal> = Dezimalzahl zwischen 0 und 103
  20.    <Tastennummer_hexadezimal> = Hexadezimalzahl zwischen 0 und 103
  21.  
  22.    Funktion: TestKey überprüft, ob die angegebene Taste gedrückt ist
  23.          oder nicht. Ist sie gedrückt, so wird RETURN_WARN==5 zurück-
  24.          gegeben, sonst RETURN_OK==0.
  25.          Bei mehreren Tasten entscheiden die Optionen ANY (default)
  26.          bzw. ALL über die Verknüpfung:
  27.          Bei ANY genügt es, daß eine der genannten Tasten gedrückt
  28.            ist, um RETURN_WARN zu erhalten.
  29.          Bei ALL müssen alle genannten Tasten gedrückt sein, um
  30.            RETURN_WARN zu erhalten.                 */
  31.  
  32. #include <clib/exec_protos.h>
  33. #include <clib/alib_protos.h>
  34. #include <devices/keyboard.h>
  35. #include <dos/dos.h>
  36. #include <stdlib.h>
  37. #include <strings.h>
  38. #include <stdio.h>
  39. #include <ctype.h>
  40.  
  41. #define MAXKEY 103
  42. #define BUFFSIZE (MAXKEY/8+1)
  43.  
  44. #define MODE_ANY FALSE
  45. #define MODE_ALL TRUE
  46.  
  47. void fail(char *msg) { puts(msg); exit(RETURN_FAIL); }
  48.  
  49. void check(short n) { if(n<0 || n>MAXKEY) fail("illegal keynumber given"); }
  50.  
  51. short hexval(char *hex)
  52. {   short prev, new;
  53.  
  54.     if(*hex==0) fail("unknown keycode '$'");
  55.     for(prev=0;*hex;++hex)
  56.     {
  57.     if(*hex>='0' && *hex<='9')                          new=*hex-'0';
  58.     else if(toupper(*hex)>='A' && toupper(*hex)<='F')   new=*hex-'A'+10;
  59.     else fail("illegal hexdigit given");
  60.     prev=(prev<<4)+new;
  61.     }
  62.     return(prev);
  63. }
  64.  
  65. #define SET(n) wanted[n>>3]|=(1<<(n&7))
  66.  
  67. void main(int argc, char *argv[])
  68. {   UBYTE wanted[BUFFSIZE], read[BUFFSIZE];
  69.     short mode,this;
  70.     struct IOStdReq *KBDRequest;
  71.     char *IOError;
  72.     struct MsgPort *Device_Port;
  73.  
  74.     mode=MODE_ANY;
  75.     for(short cnt=0;cnt<BUFFSIZE;++cnt) wanted[cnt]=0;
  76.     /* Parsing */
  77.     for(short cnt=1;cnt<argc;++cnt)
  78.     {
  79.     if(*argv[cnt]=='$')
  80.         { /* Angabe als Hex-Zahl */
  81.         this=hexval(argv[cnt]+1);
  82.         check(this);
  83.         SET(this);
  84.         }
  85.     else if(*argv[cnt]<='0' && *argv[cnt]>='9')
  86.         { /* Angabe als Dez-Zahl */
  87.         this=atol(argv[cnt]);
  88.         check(this);
  89.         SET(this);
  90.         }
  91.     else if(!stricmp(argv[cnt],"ANY"))      mode=MODE_ANY;
  92.     else if(!stricmp(argv[cnt],"ALL"))      mode=MODE_ALL;
  93.     else if(!stricmp(argv[cnt],"QUALIFIER")) wanted[12]=255; /* 96..103 */
  94.     else if(!stricmp(argv[cnt],"NUMPAD"))
  95.         {
  96.         wanted[1]|=128;    /* 15 */
  97.         wanted[3]|=224;    /* 29 .. 31 */
  98.         wanted[5]|=224;    /* 45 .. 47 */
  99.         wanted[7]|=224;    /* 61 .. 63 */
  100.         wanted[8]|=8;    /* 67 */
  101.         wanted[9]|=4;    /* 74 */
  102.         wanted[11]|=124;    /* 90 .. 94 */
  103.         }
  104.     else if(!stricmp(argv[cnt],"FKEYS"))
  105.         {
  106.         wanted[10]=255;    /* 80 .. 87 */
  107.         wanted[11]|=3;    /* 88 .. 89 */
  108.         }
  109.     else if(!stricmp(argv[cnt],"RETURN"))   wanted[8]|=24; /* 67 .. 68 */
  110.     else if(!stricmp(argv[cnt],"MISC"))
  111.         {
  112.         wanted[8]|=102;    /* 65, 66, 69, 70 */
  113.         wanted[9]|=240;    /* 76 .. 79 */
  114.         wanted[11]|=128;    /* 95 */
  115.         }
  116.     else if(!stricmp(argv[cnt],"SPACE"))    wanted[8]|=1; /* 64 */
  117.     else fail("illegal keycode given");
  118.     }
  119.  
  120.     /* Lesen des Ist-Standes: */
  121.     IOError=NULL;
  122.     if(Device_Port=CreatePort(0,0))
  123.     {
  124.     if(KBDRequest=CreateStdIO(Device_Port))
  125.         {
  126.         if(OpenDevice("keyboard.device",0,
  127.               (struct IORequest *)KBDRequest,0)==0)
  128.         {
  129.         KBDRequest->io_Data=read;
  130.         KBDRequest->io_Length=BUFFSIZE;
  131.         KBDRequest->io_Command=KBD_READMATRIX;
  132.         DoIO((struct IORequest *)KBDRequest);
  133.         if(KBDRequest->io_Error)
  134.             {
  135.             printf("io_Error==%d\n",KBDRequest->io_Error);
  136.             IOError="KBD_READMATRIX failed";
  137.             }
  138.         CloseDevice((struct IORequest *)KBDRequest);
  139.         }
  140.         else IOError="OpenDevice() on keyboard.device failed";
  141.         DeleteStdIO(KBDRequest);
  142.         }
  143.     else IOError="CreateStdIO() failed";
  144.     DeletePort(Device_Port);
  145.     }
  146.     else IOError="CreatePort() failed";
  147.     if(IOError) fail(IOError);
  148.  
  149.     /* "Vergleich" mit soll: */
  150.     for(short cnt=0;cnt<BUFFSIZE;++cnt) read[cnt]&=wanted[cnt];
  151.  
  152.     /* Auswertung */
  153.     if(mode==MODE_ANY)
  154.     { /* mindestens eine Taste */
  155.     for(short cnt=0;cnt<BUFFSIZE;++cnt)
  156.         if(read[cnt])   exit(RETURN_WARN);
  157.     exit(RETURN_OK);
  158.     }
  159.     else{ /* alle Tasten */
  160.     for(short cnt=0;cnt<BUFFSIZE;++cnt)
  161.         if(read[cnt]!=wanted[cnt])  exit(RETURN_OK);
  162.     exit(RETURN_WARN);
  163.     }
  164. }
  165.